package tech.aistar.day11;

import tech.aistar.day06.extend.Animal;
import tech.aistar.day06.extend.Cat;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 本类用来演示: 通配符?
 *
 * @author: success
 * @date: 2021/3/22 3:12 下午
 */
public class Generic02Demo {
    public static void main(String[] args) {
        //1. 泛型只有编译期的概念,没有运行期间的概念[泛型在运行期间将会被擦除]
        List<String> list = new ArrayList<String>();
        //2. 获取对象的运行时类型 - 获取对象的class实例
        Class<?> c = list.getClass();//class java.util.ArrayList
        System.out.println(c);

        //Animal cat = new Cat();
        //System.out.println(cat.getClass());

        List<Integer> intList = new ArrayList<Integer>();
        intList.add(10);
        intList.add(20);
        intList.add(30);

        List<Long> longList = new ArrayList<Long>();
        longList.add(100L);
        longList.add(200L);
        longList.add(300L);

        System.out.println(intList.getClass() == longList.getClass());//true

        //数字的包装类型->抽象的父类Number
        //List<Number> list04 = new ArrayList<Integer>();//ok

        //思考 - 能否使用一个方法能够同时输出上面俩个集合对象
        printList(intList);

        printList(longList);
    }

    /**
     * ? extends T
     * 传进来的类型只能是T或者T的子类 - 指定类型的上限
     *
     * ? super T
     * 传进来的类型只能是T或者T的父类 - 指定类型的下限.
     * @param list
     */
    public static void printList(List<? extends Number> list){
        Iterator<? extends Number> iter = list.iterator();

        while(iter.hasNext()){
            Number n = iter.next();
            System.out.println(n);
        }
    }
}
